/* who1.c - who 程序的第一个版本  
 *          - 打开、读取 UTMP 文件，并显示结果  
 */  
#include <stdio.h>  
#include <stdlib.h>   /* 添加 stdlib.h 以使用 exit() */  
#include <utmp.h>  
#include <fcntl.h>  
#include <unistd.h>  

#define SHOWHOST /* 在输出中包含远程机器信息 */  

void show_info(struct utmp *); /* 函数声明，添加返回类型 */  

/**  
 * 主函数  
 */  
int main()  
{  
    struct utmp current_record; /* 将信息读入此处 */  
    int utmpfd;                  /* 从此描述符读取 */  
    ssize_t reclen = sizeof(current_record); /* 记录长度，使用 ssize_t 更合适 */  

    /* 以只读方式打开 UTMP 文件 */  
    utmpfd = open(UTMP_FILE, O_RDONLY);  
    if (utmpfd == -1) {  
        perror(UTMP_FILE); /* UTMP_FILE 定义在 utmp.h */  
        return 1;          /* 返回错误码 */  
    }  

    /* 读取 UTMP 文件中的记录 */  
    while (read(utmpfd, &current_record, reclen) == reclen) {  
        show_info(&current_record);  
    }  

    close(utmpfd);  
    return 0; /* 正常退出 */  
}  

/*  
 * show_info()  
 * 以人类可读的形式显示 utmp 结构体的内容  
 * 注意：这些大小不应硬编码  
 */  
void show_info(struct utmp *utbufp)  
{  
    printf("%-8.8s", utbufp->ut_name); /* 登录名 */  
    printf(" ");                        /* 一个空格 */  
    printf("%-8.8s", utbufp->ut_line); /* 终端 */  
    printf(" ");                        /* 一个空格 */  
    printf("%10ld", utbufp->ut_time);  /* 登录时间 */  
    printf(" ");                        /* 一个空格 */  
#ifdef SHOWHOST  
    if (utbufp->ut_host[0] != '\0') {  
        printf("(%s)", utbufp->ut_host); /* 主机名 */  
    }  
#endif  
    printf("\n"); /* 换行 */  
}
